{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# feature engineering\n",
    "特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。简而言之，特征工程就是一个把原始数据转变成特征的过程，这些特征可以很好的描述这些数据，并且利用它们建立的模型在未知数据上的表现性能可以达到最优（或者接近最佳性能）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import lightgbm as lgb\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.metrics import r2_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def parseData(df):\n",
    "    \"\"\"\n",
    "    预处理数据\n",
    "    \"\"\"\n",
    "    df['rentType'][df['rentType']=='--'] = '未知方式'\n",
    "    \n",
    "    # object类型数据转换为category\n",
    "    df['region'] = [re[5: ] for re in df['region']]\n",
    "    df['plate'] = [pl[5: ] for pl in df['plate']]\n",
    "    columns = ['rentType', 'houseFloor', 'houseToward', 'houseDecoration', 'communityName', 'region', 'plate']\n",
    "    for col in columns:\n",
    "        df[col] = df[col].astype('category')\n",
    "        \n",
    "    # buildYear列转换为整型数据，并将缺失值填充为众数\n",
    "    tmp = df['buildYear'].copy()\n",
    "    tmp2 = tmp[tmp!='暂无信息'].astype('int')\n",
    "    tmp[tmp=='暂无信息'] = tmp2.mode().iloc[0]\n",
    "    df['buildYear'] = tmp\n",
    "    df['buildYear'] = df['buildYear'].astype('int')\n",
    "    \n",
    "    # pv和uv的缺失值填充为均值，并且转换为整型\n",
    "    df['pv'].fillna(df['pv'].mean(),inplace=True)\n",
    "    df['uv'].fillna(df['uv'].mean(),inplace=True)\n",
    "    df['pv'] = df['pv'].astype('int')\n",
    "    df['uv'] = df['uv'].astype('int')\n",
    "    \n",
    "    # 去掉部分特征\n",
    "    df.drop('city',axis=1,inplace=True)\n",
    "    \n",
    "    \n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def washData(df_train, df_test):\n",
    "    \"\"\"\n",
    "    清洗数据\n",
    "    \"\"\"\n",
    "    # 根据异常值检测得出区间\n",
    "    df_train = df_train[df_train['area']<=200]\n",
    "    df_train = df_train[df_train['tradeMoney']<=10000]\n",
    "    df_train = df_train[df_train['totalFloor']<=50]\n",
    "    df_train = df_train[df_train['saleSecHouseNum']<=5]\n",
    "    df_train = df_train[df_train['remainNewNum']<=1500]\n",
    "    \n",
    "    df_train.drop('ID', axis=1, inplace=True)\n",
    "    df_test.drop('ID', axis=1,inplace=True)\n",
    "    \n",
    "    def rentType_trans(rt):\n",
    "        if rt == '未知方式':\n",
    "            return 0\n",
    "        elif rt == '整租':\n",
    "            return 1\n",
    "        elif rt == '合租':\n",
    "            return 2\n",
    "        else:\n",
    "            return 0\n",
    "\n",
    "    df['rentType'] = df['rentType'].apply(rentType_trans)\n",
    "    \n",
    "    # 楼层高低数值化    \n",
    "    def houseFloor_trans(hf):\n",
    "        if hf == '低':\n",
    "            return 0\n",
    "        elif hf == '中':\n",
    "            return 1\n",
    "        else:\n",
    "            return 2\n",
    "\n",
    "    df['houseFloor'] = df['houseFloor'].apply(houseFloor_trans)\n",
    "\n",
    "    \n",
    "    # 房屋朝向数值化\n",
    "    def houseToward_trans(ht):\n",
    "        if ht in ['南', '南北', '东南', '西南']:\n",
    "            return 1\n",
    "        elif ht in ['东', '东西', '西']:\n",
    "            return 2\n",
    "        elif ht in ['西北','东北']:\n",
    "            return 3\n",
    "        else:\n",
    "            return 4\n",
    "\n",
    "    df['houseToward'] = df['houseToward'].apply(houseToward_trans)\n",
    "\n",
    "    # 装修类型\n",
    "    def houseDecoration_trans(hd):\n",
    "        if hd == '毛坯':\n",
    "            return 1\n",
    "        elif hd == '简装':\n",
    "            return 2\n",
    "        else:\n",
    "            return 3\n",
    "\n",
    "    df['houseDecoration'] = df['houseDecoration'].apply(houseDecoration_trans)\n",
    "    return df_train, df_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def feature(df):\n",
    "    \"\"\"\n",
    "    特征\n",
    "    \"\"\"\n",
    "\n",
    "\n",
    "    # 根据房型信息抽取出更细的信息\n",
    "    df['room'] = [int(ht[0]) for ht in df['houseType']]\n",
    "    df['hall'] = [int(ht[2]) for ht in df['houseType']]\n",
    "    df['bath'] = [int(ht[-2]) for ht in df['houseType']]\n",
    "    df['totalRoom'] = df['room'] + df['hall'] + df['bath']\n",
    "    df['area_per_room'] = df['area'] / df['totalRoom']\n",
    "    \n",
    "    \n",
    "    # rentType缺失值的填充\n",
    "    df.loc[(df['area'] <= 50) & (df['room'] >= 3) & (df['rentType'] == 0), 'rentType'] = 2\n",
    "    df.loc[(df['rentType'] == 2) & (df['area'] > 50), 'area'] = df['area'] / (df['room'] + 1)\n",
    "\n",
    "\n",
    "    df.loc[(df['houseDecoration'] == 1) & (df['rentType'] == 0), 'rentType'] = 1\n",
    "\n",
    "    \n",
    "    df['communityName'] = [int(cn[2: ]) for cn in df['communityName']]\n",
    "    \n",
    "    \n",
    "    # 交易月份\n",
    "    df['trade_month'] = [int(time.split('/')[1]) for time in df['tradeTime']]\n",
    "    # 交易季节\n",
    "    df['season'] = [int(np.ceil(month / 3)) for month in df['trade_month']]\n",
    "\n",
    "    # 大致所在楼层\n",
    "    df['floor_ratio'] = round(df['totalFloor'] * ((df['houseFloor'] * 2 + 1) / 6))\n",
    "    df['per_pv'] = df['pv'] / df['uv']\n",
    "    df['mean_pv'] = (df['pv'] + df['uv']) / 2\n",
    "    df['max_pv'] = np.max(df[['pv', 'uv']], axis=1)\n",
    "    df['min_pv'] = np.min(df[['pv', 'uv']], axis=1)\n",
    "    df['std_pv'] = np.std(df[['pv', 'uv']], axis=1)\n",
    "    df['worker_ratio'] = df['totalWorkers'] / df['residentPopulation']\n",
    "    \n",
    "    df['room'] = [1 if rt == 2 else room for rt, room in np.array(df[['rentType', 'room']])]\n",
    "    df['totalRoom'] = [1 if rt == 2 else tr for rt, tr in np.array(df[['rentType', 'totalRoom']])]\n",
    "    \n",
    "    a = df.groupby(['plate', 'rentType']).mean().reset_index()[['plate', 'rentType', 'tradeMoney']].sort_values('tradeMoney', ascending=False).rename(columns={'tradeMoney': 'plate_mean'})\n",
    "    b = df.groupby(['region', 'rentType']).mean().reset_index()[['region', 'rentType', 'tradeMoney']].sort_values('tradeMoney', ascending=False).rename(columns={'tradeMoney': 'region_mean'})\n",
    "    c = df.groupby(['plate', 'rentType']).median().reset_index()[['plate', 'rentType', 'tradeMoney']].sort_values('tradeMoney', ascending=False).rename(columns={'tradeMoney': 'plate_median'})\n",
    "    d = df.groupby(['region', 'rentType']).median().reset_index()[['region', 'rentType', 'tradeMoney']].sort_values('tradeMoney', ascending=False).rename(columns={'tradeMoney': 'region_median'})\n",
    "\n",
    "    df = df.merge(a, how='left', on=['plate', 'rentType'])\n",
    "    df = df.merge(b, how='left', on=['region', 'rentType'])\n",
    "    df = df.merge(c, how='left', on=['plate', 'rentType'])\n",
    "    df = df.merge(d, how='left', on=['region', 'rentType'])\n",
    "    \n",
    "    a = df.groupby(['region']).size().reset_index().rename(columns={0: 'region_num'})\n",
    "    df = df.merge(a, how='left', on=['region'])\n",
    "    a = df.groupby(['plate']).size().reset_index().rename(columns={0: 'plate_num'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    a = df.groupby(['communityName']).size().reset_index().rename(columns={0: 'community_num'})\n",
    "    df = df.merge(a, how='left', on=['communityName'])\n",
    "    a = df[['region', 'plate']].groupby(['region']).apply(lambda x: x['plate'].nunique()).reset_index().rename(columns={0: 'plate_contain'})\n",
    "    df = df.merge(a, how='left', on=['region'])\n",
    "    a = df.groupby('plate').apply(lambda x: x['communityName'].nunique()).reset_index().rename(columns={0: 'community_contain'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    \n",
    "    a = df.groupby('plate').mean().reset_index()[['plate', 'totalFloor']].rename(columns={'totalFloor': 'plate_mean_floor'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    a = df.groupby('plate').median().reset_index()[['plate', 'totalFloor']].rename(columns={'totalFloor': 'plate_median_floor'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    a = df.groupby('plate').mean().reset_index()[['plate', 'area']].rename(columns={'area': 'plate_mean_area'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    a = df.groupby('plate').median().reset_index()[['plate', 'area']].rename(columns={'area': 'plate_median_area'})\n",
    "    df = df.merge(a, how='left', on=['plate'])\n",
    "    \n",
    "    df['room_ratio'] = df['room'] / df['totalRoom']\n",
    "    df['hall_ratio'] = df['hall'] / df['totalRoom']\n",
    "    df['bath_ratio'] = df['bath'] / df['totalRoom']\n",
    "    df['room-bath'] = df['room'] - df['bath']\n",
    "\n",
    "    df['max_type'] = np.argmax(np.array(df[['room', 'hall', 'bath']]), axis=1)\n",
    "\n",
    "    df['trade_avg'] = df['totalTradeArea'] / (df['tradeSecNum'] + 1)\n",
    "\n",
    "    df['originWorkers'] = df['totalWorkers'] - df['newWorkers']\n",
    "\n",
    "    # df['feature2'] = df['plate_mean'] / df['region_mean']\n",
    "\n",
    "    df['area_part'] = pd.qcut(df['area'], q=6, labels=[0, 1, 2, 3, 4, 5])\n",
    "\n",
    "    df['tf_part'] = pd.qcut(df['totalFloor'], q=8, duplicates='drop', labels=[i for i in range(6)])\n",
    "    \n",
    "    # plate, room, area, totalRoom\n",
    "\n",
    "    a = df.groupby(['communityName']).apply(lambda x: x['totalRoom'].tolist()).reset_index()\n",
    "    a['mean_totalRoom'] = [np.mean(i) for i in a[0]]\n",
    "    a['median_totalRoom'] = [np.median(i) for i in a[0]]\n",
    "    a = a.drop(0, axis=1)\n",
    "    df = df.merge(a, how='left', on=['communityName'])\n",
    "\n",
    "    a = df.groupby(['communityName']).apply(lambda x: x['room'].tolist()).reset_index()\n",
    "    a['mean_room'] = [np.mean(i) for i in a[0]]\n",
    "    a['median_room'] = [np.median(i) for i in a[0]]\n",
    "    a = a.drop(0, axis=1)\n",
    "    df = df.merge(a, how='left', on=['communityName'])\n",
    "\n",
    "    a = df.groupby(['plate', 'area_part']).apply(lambda x: x['totalRoom'].tolist()).reset_index()\n",
    "    a['plate_mean_totalRoom'] = [np.mean(i) for i in a[0]]\n",
    "    a['plate_median_totalRoom'] = [np.median(i) for i in a[0]]\n",
    "    a = a.drop(0, axis=1)\n",
    "    df = df.merge(a, how='left', on=['plate', 'area_part'])\n",
    "\n",
    "    a = df.groupby(['plate', 'area_part']).apply(lambda x: x['room'].tolist()).reset_index()\n",
    "    a['plate_mean_room'] = [np.mean(i) for i in a[0]]\n",
    "    a['plate_median_room'] = [np.median(i) for i in a[0]]\n",
    "    a = a.drop(0, axis=1)\n",
    "    df = df.merge(a, how='left', on=['plate', 'area_part'])\n",
    "    \n",
    "    # categorical_feats\n",
    "    categorical_feats = [ 'region', 'plate']\n",
    "    return df, categorical_feats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getData(feature):\n",
    "    \"\"\"\n",
    "    获取数据\n",
    "    \"\"\"\n",
    "    train = pd.read_csv('train_data.csv')\n",
    "    test = pd.read_csv('test_a.csv')\n",
    "    \n",
    "    train = parseData(train)\n",
    "    test = parseData(test)\n",
    "    train, test = washData(train, test)\n",
    "    \n",
    "    train, col = feature(train)\n",
    "    test, col = feature(test)\n",
    "    \n",
    "    target = train.pop('tradeMoney')\n",
    "    features = train.columns\n",
    "    categorical_feats = col\n",
    "    \n",
    "    return train, test, target, features, categorical_feats"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# feature selection\n",
    "在机器学习的实际应用中，特征数量往往较多，其中可能存在不相关的特征，特征之间也可能存在相互依赖，容易导致如下的后果：\n",
    "Ø 特征个数越多，分析特征、训练模型所需的时间就越长。\n",
    "Ø 特征个数越多，容易引起“维度灾难”，模型也会越复杂，其推广能力会下降。\n",
    "## Filter\n",
    "### 相关系数法\n",
    "### 卡方检验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import SelectKBest,SelectPercentile\n",
    "from sklearn.feature_selection import chi2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "y = train_data[\"tradeMoney\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 去掉字符型特征\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对大数据取log1p\n",
    "# big_col = []\n",
    "# for col in X.columns:\n",
    "#     if X[col].mean()>2000:\n",
    "#         big_col.append(col)\n",
    "#         X[col] = np.log1p(X[col])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# X.buildYear = X.buildYear - X.buildYear.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for col in X.columns:\n",
    "#     X[col] = X[col].apply(lambda x: round(x,-2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# SelectPercentile 百分比\n",
    "# 浮点型数值太大了 \n",
    "# X_new = SelectKBest(chi2, k=40).fit_transform(X, y)\n",
    "# X_new = SelectPercentile(chi2,percentile = 10).fit(X, y).get_support(indices = True)\n",
    "X_new = SelectKBest(chi2, k=43).fit(X, y).get_support(indices = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Information gain（信息增益）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Correlation coefficient scores（相关系数）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Wrapper\n",
    "### 递归特征消除法(RFE)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import RFE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "lr = LinearRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "rfe = RFE(lr, n_features_to_select=40)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "y = train_data[\"tradeMoney\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 去掉字符型特征\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)\n",
    "X_columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RFE(estimator=LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n",
       "                               normalize=False),\n",
       "    n_features_to_select=40, step=1, verbose=0)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rfe.fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their rank:\n",
      "[(1, 'HomeNum'), (1, 'area'), (1, 'bankNum'), (1, 'buildYear'), (1, 'busStationNum'), (1, 'drugStoreNum'), (1, 'gymNum'), (1, 'hospitalNum'), (1, 'interSchoolNum'), (1, 'landMeanPrice'), (1, 'lookNum'), (1, 'mallNum'), (1, 'newWorkers'), (1, 'parkNum'), (1, 'privateSchoolNum'), (1, 'remainNewNum'), (1, 'residentPopulation'), (1, 'saleSecHouseNum'), (1, 'school'), (1, 'schoolNum'), (1, 'shopNum'), (1, 'subwayStationNum'), (1, 'superMarketNum'), (1, 'supplyLandArea'), (1, 'supplyLandNum'), (1, 'supplyNewNum'), (1, 'totalFloor'), (1, 'totalNewTradeArea'), (1, 'totalTradeArea'), (1, 'totalWorkers'), (1, 'tradeLandNum'), (1, 'tradeMeanPrice'), (1, 'tradeNewMeanPrice'), (1, 'tradeNewNum'), (1, 'tradeSecNum'), (1, 'uv'), (1, '交易月份'), (1, '卫'), (1, '厅'), (1, '室'), (2, 'tradeLandArea'), (3, 'pv'), (4, 'totalTradeMoney'), (5, 'totalNewTradeMoney'), (6, 'landTotalPrice')]\n"
     ]
    }
   ],
   "source": [
    "print(\"Features sorted by their rank:\")\n",
    "print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), X.columns)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1,\n",
       "        1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 1, 1, 1, 1, 3, 1, 1, 1, 1,\n",
       "        1]), 40)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rfe.ranking_,rfe.n_features_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ True  True  True  True  True  True  True  True  True  True  True  True\n",
      "  True  True  True  True  True  True  True  True False  True  True  True\n",
      " False  True  True  True  True  True  True  True  True False False  True\n",
      "  True  True  True False  True  True  True  True  True]\n"
     ]
    }
   ],
   "source": [
    "print(rfe.support_) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "sel_features = [f for f, s in zip(X_columns, rfe.support_) if s]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = train_data[sel_features]\n",
    "test = test_data[sel_features]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "categorical_feats = ['rentType', 'houseFloor', 'houseToward', 'houseDecoration', 'region', 'plate']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in categorical_feats:\n",
    "    train = pd.concat([train_data[col],train],axis = 1)\n",
    "    test = pd.concat([test_data[col],test],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "# train.reset_index()\n",
    "# test.reset_index()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Embedded\n",
    "### 基于惩罚项的特征选择法\n",
    "### 基于树模型的特征选择法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Ridge"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "y = train_data[\"tradeMoney\"]\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)\n",
    "X_columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Ridge(alpha=5, copy_X=True, fit_intercept=True, max_iter=None, normalize=False,\n",
       "      random_state=None, solver='auto', tol=0.001)"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ridge = Ridge(alpha=5)\n",
    "ridge.fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "coefSort = ridge.coef_.argsort()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2,  1, 32, 11, 17, 13, 10,  5, 16,  6, 41,  8, 23, 28, 40, 25, 21,\n",
       "       37, 36, 31, 34, 24, 20, 38, 35, 39, 33, 26, 22, 29, 27, 15, 19, 42,\n",
       "       44, 14,  0,  7,  4,  9, 30, 12, 18, 43,  3], dtype=int64)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefSort "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "featureCoefSore=ridge.coef_[coefSort]   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-4.38301292e+02, -1.69254244e+02, -1.63740141e+02, -5.87931403e+01,\n",
       "       -3.71155602e+01, -2.62890837e+01, -1.69722257e+01, -8.02956563e+00,\n",
       "       -5.94038370e+00, -5.93989474e+00, -4.79050535e+00, -4.33285297e+00,\n",
       "       -1.36989383e+00, -1.62312942e-01, -6.76635064e-02, -4.74675081e-02,\n",
       "       -1.37987101e-02, -4.45986872e-03, -2.12023321e-03, -1.22916146e-03,\n",
       "       -1.15667229e-07,  5.86155038e-07,  9.75775044e-07,  3.93635622e-04,\n",
       "        1.49620901e-03,  2.38266754e-03,  2.67458704e-03,  3.11321364e-03,\n",
       "        2.93132690e-02,  4.76457160e-02,  1.08160245e+00,  2.79345587e+00,\n",
       "        9.84138723e+00,  1.20649950e+01,  2.03858963e+01,  4.27162016e+01,\n",
       "        5.28124809e+01,  5.53884022e+01,  8.45240152e+01,  9.61512619e+01,\n",
       "        1.10290792e+02,  1.49584651e+02,  1.92802415e+02,  2.54093725e+02,\n",
       "        8.61649262e+02])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "featureCoefSore"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['厅', '室', 'tradeLandNum', 'privateSchoolNum', 'parkNum', 'drugStoreNum',\n",
       "       'schoolNum', 'buildYear', 'shopNum', 'saleSecHouseNum', 'lookNum',\n",
       "       'busStationNum', 'tradeSecNum', 'remainNewNum', 'uv',\n",
       "       'totalNewTradeArea', 'totalTradeArea', 'newWorkers', 'totalWorkers',\n",
       "       'supplyLandArea', 'landTotalPrice', 'totalNewTradeMoney',\n",
       "       'totalTradeMoney', 'residentPopulation', 'landMeanPrice', 'pv',\n",
       "       'tradeLandArea', 'tradeNewMeanPrice', 'tradeMeanPrice', 'supplyNewNum',\n",
       "       'tradeNewNum', 'bankNum', 'superMarketNum', '交易月份', 'school', 'gymNum',\n",
       "       'area', 'subwayStationNum', 'totalFloor', 'interSchoolNum',\n",
       "       'supplyLandNum', 'hospitalNum', 'mallNum', 'HomeNum', '卫'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_columns[coefSort]      # 从小到达排序的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "sel_features = [f for f, s in zip(X_columns, featureCoefSore) if abs(s)> 2 ] # 选择绝对值大于二的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = train_data[sel_features]\n",
    "test = test_data[sel_features]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in categorical_feats:\n",
    "    train = pd.concat([train_data[col],train],axis = 1)\n",
    "    test = pd.concat([test_data[col],test],axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 基于树模型的特征选择法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 随机森林 平均不纯度减少（mean decrease impurity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "y = train_data[\"tradeMoney\"]\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)\n",
    "X_columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features sorted by their score:\n",
      "[(0.547, 'area'), (0.1879, 'tradeMeanPrice'), (0.0331, 'totalFloor'), (0.0326, 'buildYear'), (0.0296, 'busStationNum'), (0.0281, 'tradeNewMeanPrice'), (0.0166, 'gymNum'), (0.0094, 'HomeNum'), (0.0084, 'interSchoolNum'), (0.0077, 'totalWorkers'), (0.0067, 'remainNewNum'), (0.0057, 'bankNum'), (0.0053, 'tradeSecNum'), (0.0051, 'saleSecHouseNum'), (0.0051, 'privateSchoolNum'), (0.005, 'pv'), (0.0048, 'residentPopulation'), (0.0043, '室'), (0.0042, '卫'), (0.0042, 'uv'), (0.0039, 'totalTradeArea'), (0.0037, 'totalTradeMoney'), (0.0036, 'superMarketNum'), (0.0035, '交易月份'), (0.0035, 'mallNum'), (0.0029, 'totalNewTradeMoney'), (0.0029, 'shopNum'), (0.0027, 'totalNewTradeArea'), (0.0026, 'newWorkers'), (0.0025, 'tradeNewNum'), (0.0024, '厅'), (0.0024, 'parkNum'), (0.0024, 'drugStoreNum'), (0.0022, 'school'), (0.0021, 'schoolNum'), (0.0014, 'subwayStationNum'), (0.0012, 'lookNum'), (0.0012, 'hospitalNum'), (0.0008, 'supplyNewNum'), (0.0003, 'tradeLandArea'), (0.0003, 'supplyLandArea'), (0.0003, 'landMeanPrice'), (0.0002, 'tradeLandNum'), (0.0002, 'supplyLandNum'), (0.0001, 'landTotalPrice')]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestRegressor\n",
    "rf = RandomForestRegressor()\n",
    "# 训练随机森林模型，并通过feature_importances_属性获取每个特征的重要性分数。rf = RandomForestRegressor()\n",
    "rf.fit(X, y)\n",
    "print(\"Features sorted by their score:\")\n",
    "print(sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), X_columns),\n",
    "             reverse=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "sel_features = [f for f, s in zip(X_columns, rf.feature_importances_) if abs(s)> 0.001 ] # 选择绝对值大于二的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = train_data[sel_features]\n",
    "test = test_data[sel_features]\n",
    "for col in categorical_feats:\n",
    "    train = pd.concat([train_data[col],train],axis = 1)\n",
    "    test = pd.concat([test_data[col],test],axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 平均精确度减少（mean decrease accuracy）????"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 打乱每个特征的特征值顺序,重要特征影响大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "Y = train_data[\"tradeMoney\"]\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)\n",
    "X_columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 320,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "'StratifiedShuffleSplit' object is not iterable",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-320-74174015e187>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     14\u001b[0m \u001b[1;31m#crossvalidate the scores on a number of different random splits of the data\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mtrain_idx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtest_idx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mss\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     16\u001b[0m     \u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mX_test\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mX\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtrain_idx\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mX\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtest_idx\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     17\u001b[0m     \u001b[0mY_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY_test\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtrain_idx\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtest_idx\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mTypeError\u001b[0m: 'StratifiedShuffleSplit' object is not iterable"
     ]
    }
   ],
   "source": [
    "# from sklearn.mode_selection import ShuffleSplit\n",
    "\n",
    "from sklearn.model_selection import StratifiedShuffleSplit\n",
    "\n",
    "from sklearn.metrics import r2_score\n",
    "from collections import defaultdict\n",
    "\n",
    "rf = RandomForestRegressor()\n",
    "scores = defaultdict(list)\n",
    "\n",
    "\n",
    "ss=StratifiedShuffleSplit(n_splits=5,test_size=0.25,train_size=0.75,random_state=0)\n",
    "\n",
    "#crossvalidate the scores on a number of different random splits of the data\n",
    "for train_idx, test_idx in ss:\n",
    "    X_train, X_test = X[train_idx], X[test_idx]\n",
    "    Y_train, Y_test = Y[train_idx], Y[test_idx]\n",
    "    # 使用修改前的原始特征训练模型，其acc作为后续混洗特征值后的对比标准。r = rf.fit(X_train, Y_train)\n",
    "    acc = r2_score(Y_test, rf.predict(X_test))\n",
    "    # 遍历每一列特征\n",
    "    for i in range(X.shape[1]):\n",
    "        X_t = X_test.copy()\n",
    "        # 对这一列特征进行混洗，交互了一列特征内部的值的顺序\n",
    "        np.random.shuffle(X_t[:, i])\n",
    "        shuff_acc = r2_score(Y_test, rf.predict(X_t))\n",
    "        # 混洗某个特征值后，计算平均精确度减少程度。scores[names[i]].append((acc-shuff_acc)/acc)\n",
    "print(\"Features sorted by their score:\")\n",
    "print(sorted([(round(np.mean(score), 4), feat) for feat, score in scores.items()], reverse=True))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-  ExtraTreesClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train_data.drop([\"tradeMoney\"],axis=1)\n",
    "Y = train_data[\"tradeMoney\"]\n",
    "for col in X.columns:\n",
    "    if X[col].dtype.name == \"category\":\n",
    "        X = X.drop([col],axis=1)\n",
    "X_columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.35083819 0.03275512 0.01746356 0.01127824 0.13572087 0.17246897\n",
      " 0.04641945 0.00182454 0.00248516 0.00192543 0.00180989 0.00227278\n",
      " 0.0018343  0.00237071 0.00193767 0.00167371 0.00231365 0.00182341\n",
      " 0.00205739 0.00233456 0.01081257 0.01117073 0.01136467 0.01065833\n",
      " 0.00835742 0.00805117 0.00879312 0.00749329 0.0091206  0.00285354\n",
      " 0.00135264 0.00140898 0.00093356 0.0008871  0.00089061 0.00123453\n",
      " 0.00182166 0.00408006 0.00198057 0.01118493 0.01106113 0.02710766\n",
      " 0.01143279 0.04049053 0.00185021]\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "model = ExtraTreesClassifier() # build extra tree model\n",
    "model.fit(X,Y)\n",
    "print(model.feature_importances_) #display importance of each variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "sel_features = [f for f, s in zip(X_columns, model.feature_importances_) if abs(s)> 0.002 ] # 选择绝对值大于二的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = train_data[sel_features]\n",
    "test = test_data[sel_features]\n",
    "for col in categorical_feats:\n",
    "    train = pd.concat([train_data[col],train],axis = 1)\n",
    "    test = pd.concat([test_data[col],test],axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 需要的数据\n",
    "- train\n",
    "- target\n",
    "- test\n",
    "- features\n",
    "- categorical_feats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = train_data.drop([\"tradeMoney\"],axis = 1)\n",
    "target = train_data[\"tradeMoney\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "test = test_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "categorical_feats = ['rentType', 'houseFloor', 'houseToward', 'houseDecoration', 'region', 'plate']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "params = {\n",
    "    'num_leaves': 31,\n",
    "    'min_data_in_leaf': 20,\n",
    "    'min_child_samples':20,\n",
    "    'objective': 'regression',\n",
    "    'learning_rate': 0.01,\n",
    "    \"boosting\": \"gbdt\",\n",
    "    \"feature_fraction\": 0.8,\n",
    "    \"bagging_freq\": 1,\n",
    "    \"bagging_fraction\": 0.85,\n",
    "    \"bagging_seed\": 23,\n",
    "    \"metric\": 'rmse',\n",
    "    \"lambda_l1\": 0.2,\n",
    "    \"nthread\": 4,\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fold 0\n",
      "Training until validation scores don't improve for 200 rounds.\n",
      "[500]\ttraining's rmse: 1168.69\tvalid_1's rmse: 1254.96\n",
      "[1000]\ttraining's rmse: 1019.85\tvalid_1's rmse: 1207.57\n",
      "[1500]\ttraining's rmse: 931.986\tvalid_1's rmse: 1187.47\n",
      "[2000]\ttraining's rmse: 867.876\tvalid_1's rmse: 1174.88\n",
      "[2500]\ttraining's rmse: 818.417\tvalid_1's rmse: 1167.8\n",
      "[3000]\ttraining's rmse: 778.598\tvalid_1's rmse: 1162.95\n",
      "[3500]\ttraining's rmse: 744.37\tvalid_1's rmse: 1158.75\n",
      "[4000]\ttraining's rmse: 715.447\tvalid_1's rmse: 1156.42\n",
      "[4500]\ttraining's rmse: 690.009\tvalid_1's rmse: 1155.07\n",
      "Early stopping, best iteration is:\n",
      "[4533]\ttraining's rmse: 688.419\tvalid_1's rmse: 1154.95\n",
      "fold 1\n",
      "Training until validation scores don't improve for 200 rounds.\n",
      "[500]\ttraining's rmse: 1174.5\tvalid_1's rmse: 1287.39\n",
      "[1000]\ttraining's rmse: 1032.19\tvalid_1's rmse: 1237.88\n",
      "[1500]\ttraining's rmse: 945.807\tvalid_1's rmse: 1213.27\n",
      "[2000]\ttraining's rmse: 882.496\tvalid_1's rmse: 1200.1\n",
      "[2500]\ttraining's rmse: 834.105\tvalid_1's rmse: 1192.23\n",
      "[3000]\ttraining's rmse: 794.229\tvalid_1's rmse: 1186.19\n",
      "[3500]\ttraining's rmse: 761.326\tvalid_1's rmse: 1181.59\n",
      "[4000]\ttraining's rmse: 732.038\tvalid_1's rmse: 1177.97\n",
      "[4500]\ttraining's rmse: 706.597\tvalid_1's rmse: 1175.14\n",
      "[5000]\ttraining's rmse: 684.442\tvalid_1's rmse: 1173.4\n",
      "[5500]\ttraining's rmse: 663.436\tvalid_1's rmse: 1172.15\n",
      "[6000]\ttraining's rmse: 645.095\tvalid_1's rmse: 1171.63\n",
      "[6500]\ttraining's rmse: 628.075\tvalid_1's rmse: 1170.5\n",
      "Early stopping, best iteration is:\n",
      "[6616]\ttraining's rmse: 624.164\tvalid_1's rmse: 1170.32\n",
      "fold 2\n",
      "Training until validation scores don't improve for 200 rounds.\n",
      "[500]\ttraining's rmse: 1154.88\tvalid_1's rmse: 1396.26\n",
      "[1000]\ttraining's rmse: 1008.94\tvalid_1's rmse: 1365.88\n",
      "[1500]\ttraining's rmse: 923.763\tvalid_1's rmse: 1356.28\n",
      "[2000]\ttraining's rmse: 861.937\tvalid_1's rmse: 1345.61\n",
      "[2500]\ttraining's rmse: 814.097\tvalid_1's rmse: 1339.52\n",
      "[3000]\ttraining's rmse: 775.998\tvalid_1's rmse: 1334.87\n",
      "[3500]\ttraining's rmse: 744.131\tvalid_1's rmse: 1331.5\n",
      "[4000]\ttraining's rmse: 716.007\tvalid_1's rmse: 1329.09\n",
      "[4500]\ttraining's rmse: 691.708\tvalid_1's rmse: 1326.99\n",
      "Early stopping, best iteration is:\n",
      "[4694]\ttraining's rmse: 683.236\tvalid_1's rmse: 1326.39\n",
      "fold 3\n",
      "Training until validation scores don't improve for 200 rounds.\n",
      "[500]\ttraining's rmse: 1124.52\tvalid_1's rmse: 1489.1\n",
      "[1000]\ttraining's rmse: 984.224\tvalid_1's rmse: 1440.55\n",
      "[1500]\ttraining's rmse: 903.768\tvalid_1's rmse: 1418.98\n",
      "[2000]\ttraining's rmse: 845.816\tvalid_1's rmse: 1406.99\n",
      "[2500]\ttraining's rmse: 801.502\tvalid_1's rmse: 1399.48\n",
      "[3000]\ttraining's rmse: 765.015\tvalid_1's rmse: 1393.25\n",
      "[3500]\ttraining's rmse: 734.727\tvalid_1's rmse: 1388.76\n",
      "[4000]\ttraining's rmse: 708.334\tvalid_1's rmse: 1386.01\n",
      "[4500]\ttraining's rmse: 684.763\tvalid_1's rmse: 1383.86\n",
      "[5000]\ttraining's rmse: 663.89\tvalid_1's rmse: 1382.29\n",
      "[5500]\ttraining's rmse: 645.046\tvalid_1's rmse: 1381.2\n",
      "[6000]\ttraining's rmse: 628.176\tvalid_1's rmse: 1379.61\n",
      "Early stopping, best iteration is:\n",
      "[6291]\ttraining's rmse: 618.782\tvalid_1's rmse: 1379.12\n",
      "fold 4\n",
      "Training until validation scores don't improve for 200 rounds.\n",
      "[500]\ttraining's rmse: 1158.08\tvalid_1's rmse: 1337.42\n",
      "[1000]\ttraining's rmse: 1013.32\tvalid_1's rmse: 1289.13\n",
      "[1500]\ttraining's rmse: 927.495\tvalid_1's rmse: 1266.53\n",
      "[2000]\ttraining's rmse: 865.739\tvalid_1's rmse: 1254.4\n",
      "[2500]\ttraining's rmse: 817.995\tvalid_1's rmse: 1247.08\n",
      "[3000]\ttraining's rmse: 779.074\tvalid_1's rmse: 1242.24\n",
      "[3500]\ttraining's rmse: 746.155\tvalid_1's rmse: 1240.75\n",
      "Early stopping, best iteration is:\n",
      "[3646]\ttraining's rmse: 737.599\tvalid_1's rmse: 1240.09\n",
      "CV Score: 0.88656 \n"
     ]
    }
   ],
   "source": [
    "folds = KFold(n_splits=5, shuffle=True, random_state=2333)\n",
    "\n",
    "oof_lgb = np.zeros(len(train))\n",
    "predictions_lgb = np.zeros(len(test))\n",
    "feature_importance_df = pd.DataFrame()\n",
    "\n",
    "for fold_, (trn_idx, val_idx) in enumerate(folds.split(train.values, target.values)):\n",
    "    print(\"fold {}\".format(fold_))\n",
    "    trn_data = lgb.Dataset(train.iloc[trn_idx], label=target.iloc[trn_idx])# categorical_feature=categorical_feats)\n",
    "    val_data = lgb.Dataset(train.iloc[val_idx], label=target.iloc[val_idx])#, categorical_feature=categorical_feats)\n",
    "\n",
    "    num_round = 10000\n",
    "    clf = lgb.train(params, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=500, early_stopping_rounds = 200)\n",
    "    \n",
    "    oof_lgb[val_idx] = clf.predict(train.iloc[val_idx], num_iteration=clf.best_iteration)\n",
    "    \n",
    "    fold_importance_df = pd.DataFrame()\n",
    "    fold_importance_df[\"feature\"] = features\n",
    "    fold_importance_df[\"importance\"] = clf.feature_importance()\n",
    "    fold_importance_df[\"fold\"] = fold_ + 1\n",
    "    feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n",
    "    \n",
    "    predictions_lgb += clf.predict(test, num_iteration=clf.best_iteration) / folds.n_splits\n",
    "    \n",
    "print(\"CV Score: {:<8.5f}\".format(r2_score(target, oof_lgb)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x2880 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cols = (feature_importance_df[[\"feature\", \"importance\"]]\n",
    "        .groupby(\"feature\")\n",
    "        .mean()\n",
    "        .sort_values(by=\"importance\", ascending=False)[:1000].index)\n",
    "\n",
    "best_features = feature_importance_df.loc[feature_importance_df.feature.isin(cols)]\n",
    "\n",
    "plt.figure(figsize=(14,40))\n",
    "sns.barplot(x=\"importance\",\n",
    "            y=\"feature\",\n",
    "            data=best_features.sort_values(by=\"importance\",\n",
    "                                           ascending=False))\n",
    "plt.title('LightGBM Features (avg over folds)')\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测结果最大值：18181.473394218847,预测结果最小值：1179.6343209811814\n",
      "0.9442224332866131\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.9442224332866131"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "online_score(predictions_lgb)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
